package cn.getech.data.metadata.utils;

import cn.getech.data.metadata.entity.meta.CollectionNotificationExample;
import cn.getech.data.metadata.entity.meta.CollectionTableInfo;
import cn.hutool.core.collection.CollectionUtil;
import org.apache.commons.lang.StringUtils;

import java.time.LocalDate;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

public class TableHtmlUtil {

    /**
     * 修改的元数据转成 html格式
     * @param addField     添加字段
     * @param updateField  修改字段
     * @param delField     删除字段
     * @param updateTable  更新表
     * @param delTable     删除表
     * @return  String title,String taskName,String creatuser,String toemail,String email
     */
   public static StringBuilder tableToHTML(ArrayList<CollectionNotificationExample> addField, ArrayList<CollectionNotificationExample> updateField,
                                           ArrayList<CollectionNotificationExample> delField,
                                           ArrayList<CollectionNotificationExample> updateTable,
                                           ArrayList<CollectionNotificationExample> delTable, HashMap<String,String> mapTable ){
       //判断是否有数据
       if(CollectionUtil.isEmpty(addField)&&
          CollectionUtil.isEmpty(updateField)&&
          CollectionUtil.isEmpty(updateTable)&&
          CollectionUtil.isEmpty(delField)&&
          CollectionUtil.isEmpty(delTable)){
           return null;
       }

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
        String formatTimeStr = dtf.format(ZonedDateTime.now());
        StringBuilder content = new StringBuilder("<html><head></head><body><h2>源端元数据变更通知</h2>");
        content.append("<div>");
           content.append("于 "+formatTimeStr+" ，监控的"+mapTable.get("title")+"的源端元数据发生改变").append("<br>");
           content.append("改变如下:").append("<br>");
        content.append("</div>");
        if (CollectionUtil.isNotEmpty(addField)){
            content.append("<h3>新增字段</h3>");
            content.append("<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\" style=\"border:solid 1px #E8F2F9;font-size=14px;;font-size:18px;\">");
            content.append("<tr style=\"background-color: #428BCA; color:#ffffff\">");
            content.append("<th>表名</th><th>表别名</th><th>变更类型</th><th>变更内容</th><th>表的大小(B)</th><th>表的数据量(条)</th>");
            content.append("</tr>");
            if(CollectionUtil.isNotEmpty(addField)){
                //依照表名分组
                Map<String, List<CollectionNotificationExample>> collect = addField.stream().collect(Collectors.groupingBy(CollectionNotificationExample::getTableName));
                for (Map.Entry<String, List<CollectionNotificationExample>> m : collect.entrySet()) {
                    content.append("<tr>");
                        List<CollectionNotificationExample> value = m.getValue();
                        if(CollectionUtil.isNotEmpty(value)){
                            content.append("<td>" + m.getKey() + "</td>"); //表名
                            content.append("<td>" + m.getValue().get(0).getTableAlias() + "</td>"); //表别名
                            content.append("<td>" + m.getValue().get(0).getChangeType()+"</td>");
                            StringBuffer changeType = new StringBuffer();
                            for(CollectionNotificationExample data : value){
                                changeType.append(data.getChangeContent()+",</br>");
                            }
                            content.append("<td>" + changeType.toString() + "</td>"); //变更类型
                            content.append("<td>" + m.getValue().get(0).getTotalSize() + "</td>"); //表大小
                            content.append("<td>" + m.getValue().get(0).getRowsNum() + "</td>"); //表数量
                        }
                    content.append("</tr>");
                }
            }
            content.append("</table>");
        }
        if(CollectionUtil.isNotEmpty(updateField)){
            content.append("<h3>修改字段</h3>");
            content.append("<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\" style=\"border:solid 1px #E8F2F9;font-size=14px;;font-size:18px;\">");
            content.append("<tr style=\"background-color: #428BCA; color:#ffffff\">");
            content.append("<th>表名</th><th>表别名</th><th>变更类型</th><th>变更内容</th><th>表的大小(B)</th><th>表的数据量(条)</th>");
            content.append("</tr>");
            if(CollectionUtil.isNotEmpty(updateField)){
                Map<String, List<CollectionNotificationExample>> collect = updateField.stream().collect(Collectors.groupingBy(CollectionNotificationExample::getTableName));
                for (Map.Entry<String, List<CollectionNotificationExample>> m : collect.entrySet()) {
                    content.append("<tr>");
                    List<CollectionNotificationExample> value = m.getValue();
                    if(CollectionUtil.isNotEmpty(value)){
                        content.append("<td>" + m.getKey() + "</td>"); //表名
                        content.append("<td>" + m.getValue().get(0).getTableAlias() + "</td>"); //表别名
                        content.append("<td>" + m.getValue().get(0).getChangeType()+"</td>");
                        StringBuffer changeType = new StringBuffer();
                        for(CollectionNotificationExample data : value){
                            changeType.append(data.getChangeContent()+",</br>");
                        }
                        content.append("<td>" + changeType.toString() + "</td>"); //变更类型
                        content.append("<td>" + m.getValue().get(0).getTotalSize() + "</td>"); //表大小
                        content.append("<td>" + m.getValue().get(0).getRowsNum() + "</td>"); //表数量
                    }
                    content.append("</tr>");
                }
            }
            content.append("</table>");
        }

       if(CollectionUtil.isNotEmpty(delField)){
           content.append("<h3>删除字段</h3>");
           content.append("<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\" style=\"border:solid 1px #E8F2F9;font-size=14px;;font-size:18px;\">");
           content.append("<tr style=\"background-color: #428BCA; color:#ffffff\">");
           content.append("<th>表名</th><th>表别名</th><th>变更类型</th><th>变更内容</th><th>表的大小(B)</th><th>表的数据量(条)</th>");
           content.append("</tr>");
           if(CollectionUtil.isNotEmpty(delField)){
               Map<String, List<CollectionNotificationExample>> collect = delField.stream().collect(Collectors.groupingBy(CollectionNotificationExample::getTableName));
               for (Map.Entry<String, List<CollectionNotificationExample>> m : collect.entrySet()) {
                   content.append("<tr>");
                   List<CollectionNotificationExample> value = m.getValue();
                   if(CollectionUtil.isNotEmpty(value)){
                       content.append("<td>" + m.getKey() + "</td>"); //表名
                       content.append("<td>" + m.getValue().get(0).getTableAlias() + "</td>"); //表别名
                       content.append("<td>" + m.getValue().get(0).getChangeType()+"</td>");
                       StringBuffer changeType = new StringBuffer();
                       for(CollectionNotificationExample data : value){
                           changeType.append(data.getChangeContent()+",</br>");
                       }
                       content.append("<td>" + changeType.toString() + "</td>"); //变更类型
                       content.append("<td>" + m.getValue().get(0).getTotalSize() + "</td>"); //表大小
                       content.append("<td>" + m.getValue().get(0).getRowsNum() + "</td>"); //表数量
                   }
                   content.append("</tr>");
               }
           }
           content.append("</table>");
       }
       if(CollectionUtil.isNotEmpty(updateTable)){
           content.append("<h3>更新表</h3>");
           content.append("<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\" style=\"border:solid 1px #E8F2F9;font-size=14px;;font-size:18px;\">");
           content.append("<tr style=\"background-color: #428BCA; color:#ffffff\">");
           content.append("<th>表名</th><th>表别名</th><th>变更类型</th><th>变更内容</th><th>表的大小(B)</th><th>表的数据量(条)</th>");
           content.append("</tr>");
           if(CollectionUtil.isNotEmpty(updateTable)){
               Map<String, List<CollectionNotificationExample>> collect = updateTable.stream().collect(Collectors.groupingBy(CollectionNotificationExample::getTableName));
               for (Map.Entry<String, List<CollectionNotificationExample>> m : collect.entrySet()) {
                   content.append("<tr>");
                   List<CollectionNotificationExample> value = m.getValue();
                   if(CollectionUtil.isNotEmpty(value)){
                       content.append("<td>" + m.getKey() + "</td>"); //表名
                       content.append("<td>" + m.getValue().get(0).getTableAlias() + "</td>"); //表别名
                       content.append("<td>" + m.getValue().get(0).getChangeType()+"</td>");
                       StringBuffer changeType = new StringBuffer();
                       for(CollectionNotificationExample data : value){
                           changeType.append(data.getChangeContent()+",</br>");
                       }
                       content.append("<td>" + changeType.toString() + "</td>"); //变更类型
                       content.append("<td>" + m.getValue().get(0).getTotalSize() + "</td>"); //表大小
                       content.append("<td>" + m.getValue().get(0).getRowsNum() + "</td>"); //表数量
                   }
                   content.append("</tr>");
               }
           }
           content.append("</table>");
       }
       if(CollectionUtil.isNotEmpty(delTable)){
           content.append("<h3>删除表</h3>");
           content.append("<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\" style=\"border:solid 1px #E8F2F9;font-size=14px;;font-size:18px;\">");
           content.append("<tr style=\"background-color: #428BCA; color:#ffffff\">");
           content.append("<th>表名</th><th>表别名</th><th>变更类型</th><th>变更内容</th><th>表的大小(B)</th><th>表的数据量(条)</th>");
           content.append("</tr>");
           if(CollectionUtil.isNotEmpty(delTable)){
               Map<String, List<CollectionNotificationExample>> collect = delTable.stream().collect(Collectors.groupingBy(CollectionNotificationExample::getTableName));
               for (Map.Entry<String, List<CollectionNotificationExample>> m : collect.entrySet()) {
                   content.append("<tr>");
                   List<CollectionNotificationExample> value = m.getValue();
                   if(CollectionUtil.isNotEmpty(value)){
                       content.append("<td>" + m.getKey() + "</td>"); //表名
                       content.append("<td>" + m.getValue().get(0).getTableAlias() + "</td>"); //表别名
                       content.append("<td>" + m.getValue().get(0).getChangeType()+"</td>");
                       content.append("<td>" + m.getValue().get(0).getTotalSize() + "</td>"); //表大小
                       content.append("<td>" + m.getValue().get(0).getRowsNum() + "</td>"); //表数量
                   }
                   content.append("</tr>");
               }
           }
           content.append("</table>");
       }
       content.append("<div>");
           content.append("<br>");
           content.append("所属任务："+mapTable.get("taskName")+"").append("<br>");
           content.append("该监控的创建人 "+mapTable.get("creatuser")+"").append("<br>");
           content.append("联系邮箱："+mapTable.get("toemail")+"").append("<br>");
           content.append("告警接收人："+mapTable.get("email")+"").append("<br>");
       content.append("</div>");
       content.append("</body></html>");
       return content;
    }
}
